home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Games / Starter / JST / Developer / sources / OSEmu / dos.s < prev    next >
Encoding:
Text File  |  1999-12-03  |  16.0 KB  |  863 lines

  1. ;APS00000000000000000000000000000000000000000000000000000000000000000000000000000000
  2. * $Id: dos.s 1.1 1999/02/03 04:09:58 jotd Exp $
  3. **************************************************************************
  4. *   DOS-LIBRARY                                                          *
  5. **************************************************************************
  6. **************************************************************************
  7. *   INITIALIZING                                                         *
  8. **************************************************************************
  9.  
  10. DOSINIT        move.l    _dosbase,d0
  11.         beq    .init
  12.         rts
  13.  
  14. .init        move.l    #1050,d0    ;(reserved function)
  15.         move.l    #$46,d1
  16.         lea    _dosname,a0
  17.         bsr    _InitLibrary
  18.         move.l    d0,a0
  19.         move.l    d0,_dosbase
  20.         
  21.         patch    _LVOLoadSeg(a0),DOSLOADSEG(pc)
  22.         patch    _LVOUnLoadSeg(a0),DOSUNLOADSEG(pc)
  23.         patch    _LVOOpen(a0),DOSOPEN(PC)
  24.         patch    _LVOClose(a0),DOSCLOSE(PC)
  25.         patch    _LVORead(a0),DOSLOAD(PC)
  26.         patch    _LVOWrite(a0),DOSSAVE(PC)
  27.         patch    _LVOSeek(a0),DOSSEEK(PC)
  28.         patch    _LVOLock(A0),DOSLOCK(PC)
  29.         patch    _LVOInput(A0),MYRTZ(PC)
  30.         patch    _LVOOutput(A0),MYRTZ(PC)
  31.         patch    _LVODeviceProc(A0),MYRTZ(PC)
  32.         patch    _LVOExamine(A0),_EXAMINE(PC)
  33.         patch    _LVOExamineFH(A0),_EXAMINEFH(PC)    ; added by JOTD
  34.         patch    _LVOUnLock(A0),_DOSUNLOCK(PC)
  35.         patch    _LVOInfo(A0),DOSINFO(PC)
  36.         patch    _LVODupLock(A0),_DUPLOCK(PC)
  37.  
  38.         patch    _LVOWaitForChar(A0),MYRTZ(PC)
  39.         patch    _LVOCurrentDir(A0),MYRTZ(PC)
  40.         patch    _LVODelay(A0),DOSDELAY(PC)    ; added by JOTD
  41.         patch    _LVOAssignPath(a0),ASSIGNPATH(PC)
  42.         patch    _LVOAssignLock(a0),ASSIGNLOCK(PC)
  43.         patch    _LVORunCommand(a0),RUNCOMMAND(PC) ; added by JOTD
  44.         patch    _LVOGetArgStr(a0),GETARGSTR(PC) ; added by JOTD
  45.  
  46.         rts
  47.  
  48. **************************************************************************
  49. *   PROGRAM EXECUTION                                                    *
  50. **************************************************************************
  51.  
  52. ;<D1:SEGLIST
  53. ;<D2:STACKSIZE
  54. ;<D3:ARGPTR
  55. ;<D4:ARGSIZE
  56.  
  57. ;RUNCOMMAND will ignore STACKSIZE: it will use the current stack
  58.  
  59. RUNCOMMAND:
  60.     move.l    D3,args_ptr
  61. ;;    move.l    D4,D0
  62.  
  63.     LSL.L    #2,D1
  64.     MOVE.L    D1,A1
  65.     ADDQ.L    #4,A1
  66.  
  67.  
  68.     jmp    (A1)    ; executes the program
  69.  
  70. GETARGSTR:
  71.     move.l    args_ptr(pc),D0
  72.     rts
  73.  
  74. args_ptr:
  75.     dc.l    0
  76.  
  77. ;>D1:FILENAME
  78. ;<D0:FIRST SEGMENT
  79. ;INTERNAL: D7-TOTAL # OF SEGMENTS
  80. ;    D6-FILEHANDLE
  81. ;    D5-SEGMENTBASE
  82. ;    A4-8 BYTES SPACE ON STACK FOR HUNKHEADERS
  83. ;LIMITATIONS: ONLY FOLLOWING HUNKS ALLOWED: HUNK_CODE, HUNK_DATA, HUNK_BSS,
  84. ;        HUNK_END, HUNK_RELOC32, HUNK_HEADER, HUNK_SYMBOL - CONTACT 
  85. ;        ME IF YOU HAVE AN EXE WITH OTHER HUNKS, IM SIMPLY MISSING 
  86. ;        THE EXAMPLES TO IMPLEMENT THEM
  87.  
  88. DOSLOADSEG
  89.     MOVEM.L    D2-D7/A2-A4,-(A7)
  90.     SUBQ.L    #8,A7
  91.     MOVE.L    A7,A4
  92.     MOVE.L    #MODE_OLDFILE,D2
  93.     BSR.W    DOSOPEN
  94.     TST.L    D0
  95.     BEQ.W    .ERR
  96.     MOVE.L    D0,D6
  97.     MOVE.L    D6,D1
  98.     MOVE.L    A4,D2
  99.     MOVEQ.L    #4,D3
  100.     BSR.W    DOSLOAD
  101.     TST.L    D0
  102.     BEQ.W    .ERR2
  103.     CMP.L    #$3F3,(A4)        ;FIRST LW=HUNK_HEADER?
  104.     BNE.W    .ERR2
  105.     MOVE.L    D6,D1
  106.     MOVE.L    A4,D2
  107.     MOVEQ.L    #4,D3
  108.     BSR.W    DOSLOAD
  109.     TST.L    D0
  110.     BEQ.W    .ERR2
  111.     TST.L    (A4)            ;NO NAME PLEASE
  112.     BNE.W    .ERR2
  113.     MOVE.L    D6,D1
  114.     MOVE.L    A4,D2
  115.     MOVEQ.L    #4,D3
  116.     BSR.W    DOSLOAD
  117.     TST.L    D0
  118.     BEQ.W    .ERR2
  119.     MOVE.L    (A4),D7            ;TOTAL # OF HUNKS
  120.     SUBQ.L    #1,D7    
  121.     MOVE.L    D6,D1
  122.     MOVE.L    A4,D2
  123.     MOVEQ.L    #8,D3
  124.     BSR.W    DOSLOAD
  125.     TST.L    D0
  126.     BEQ.W    .ERR2
  127.     TST.L    (A4)            ;FIRST HUNK HAS TO BE 0
  128.     BNE.W    .ERR2
  129.     CMP.L    4(A4),D7        ;LAST HUNK HAS TO BE HUNK_COUNT
  130.     BNE.W    .ERR2
  131.  
  132.     MOVEQ.L    #0,D4            ;ALLOC MEM FOR ALL SEGMENTS
  133.     MOVEQ.L    #0,D5
  134. .1
  135.  
  136.     MOVE.L    D6,D1
  137.     MOVE.L    A4,D2
  138.     MOVEQ.L    #4,D3            ;GET SIZE AND MEMFLAGS OF HUNK
  139.     BSR.W    DOSLOAD
  140.     TST.L    D0
  141.     BEQ.W    .ERR3
  142.  
  143.     MOVE.L    (A4),D0
  144.  
  145.     ; added by JOTD: check memtype requirement
  146.  
  147.     bsr    .getmemflag    ; >D1: MEMF_xxx
  148.  
  149.     ; compute mem size
  150.  
  151.     LSL.L    #2,D0
  152.     ADDQ.L    #8,D0
  153.     MOVE.L    D0,D2            ;ALLOC MEM IN SIZE
  154.     ADDQ.L    #7,D0
  155.     AND.L    #$FFFFFFF8,D0
  156.  
  157.     BSR.W    ALLOCM
  158.     TST.L    D0
  159.     BEQ.W    .ERR3
  160.     MOVE.L    D0,A3
  161.     MOVE.L    D2,(A3)
  162.     CLR.L    4(A3)
  163.  
  164.     TST.L    D4
  165.     BNE.S    .2
  166.     MOVE.L    D0,D5            ;D5-POINTER TO 1ST SEGMENT
  167.     BRA.S    .3
  168.  
  169. .2
  170.     MOVE.L    D5,A3            ;POINTER TO 1ST SEGMENT
  171. .5    TST.L    4(A3)
  172.     BEQ.S    .4
  173.     MOVE.L    4(A3),D2        ;NEXT SEGMENT
  174.     LSL.L    #2,D2
  175.     SUBQ.L    #4,D2
  176.     MOVE.L    D2,A3
  177.     BRA.S    .5
  178.  
  179.  
  180. .4    ADDQ.L    #4,D0
  181.     LSR.L    #2,D0
  182.     MOVE.L    D0,4(A3)
  183. .3    ADDQ.L    #1,D4
  184.     CMP.L    D7,D4
  185.     BLS.S    .1
  186.                     ;HEADER COMPLETE, MEM ALLOCATED
  187.  
  188.             ;NOW PROCESSING THE HUNK_CODE, HUNK_DATA AND HUNK_BSS
  189.     MOVEQ.L    #0,D4
  190. .HN    MOVE.L    D6,D1
  191.     MOVE.L    A4,D2
  192.     MOVEQ.L    #4,D3            ;GET TYPE OF HUNK
  193.     BSR.W    DOSLOAD
  194.     TST.L    D0
  195.     BEQ.W    .ERR3
  196.     AND.L    #$3FFFFFFF,(A4)
  197.     CMP.L    #$3E9,(A4)        ;HUNK_CODE?
  198.     BEQ.S    .HCD
  199.     CMP.L    #$3EA,(A4)        ;HUNK_DATA?
  200.     BEQ.S    .HCD
  201.     CMP.L    #$3EB,(A4)        ;HUNK_BSS?
  202.     BEQ.S    .HBSS
  203.     BRA.W    .ERR3
  204.  
  205. .HBSS    
  206.     MOVE.L    D6,D1            ;BSS-HUNK
  207.     MOVE.L    A4,D2
  208.     MOVEQ.L    #4,D3            ;IGNORE SIZE OF HUNK
  209.     BSR.W    DOSLOAD
  210.     TST.L    D0
  211.     BEQ.W    .ERR3
  212.     BRA.S    .INNERHUNK
  213.  
  214. .HCD    MOVE.L    D6,D1            ;CODE- AND DATA-HUNK
  215.     MOVE.L    A4,D2
  216.     MOVEQ.L    #4,D3            ;GET SIZE OF HUNK
  217.     BSR.W    DOSLOAD
  218.     TST.L    D0
  219.     BEQ.W    .ERR3
  220.     MOVE.L    (A4),D3            ;LEN OF HUNK
  221.     LSL.L    #2,D3
  222.     MOVE.L    D4,D1            ;ACTUAL HUNK
  223.     MOVE.L    D5,A3            ;START OF 1ST SEGMENT
  224.     BRA.S    .HCD1
  225.  
  226. .HCD2    MOVE.L    4(A3),D2
  227.     LSL.L    #2,D2
  228.     SUBQ.L    #4,D2
  229.     MOVE.L    D2,A3
  230. .HCD1    DBF    D1,.HCD2
  231.     MOVE.L    A3,D2
  232.     ADDQ.L    #8,D2
  233.     MOVE.L    D6,D1
  234.     BSR.W    DOSLOAD
  235.     TST.L    D0
  236.     BEQ.W    .ERR3
  237.  
  238. .INNERHUNK
  239.     MOVE.L    D6,D1
  240.     MOVE.L    A4,D2
  241.     MOVEQ.L    #4,D3            ;GET TYPE OF HUNK
  242.     BSR.W    DOSLOAD
  243.     TST.L    D0
  244.     BEQ.W    .ERR3
  245.     CMP.L    #$3EC,(A4)        ;HUNK_RELOC32?
  246.     BEQ.S    .HRELOCT
  247.     CMP.L    #$3F2,(A4)        ;HUNK_END?
  248.     BEQ.W    .HENDT
  249.     CMP.L    #$3F0,(A4)        ;HUNK_SYMBOL?
  250.     BEQ.W    .HSYMBOLT
  251.     BRA.W    .ERR3
  252.  
  253. .HRELOCT
  254.     MOVE.L    D6,D1
  255.     MOVE.L    A4,D2
  256.     MOVEQ.L    #4,D3            ;GET COUNT OF LW-RELOCS
  257.     BSR.W    DOSLOAD
  258.     TST.L    D0
  259.     BEQ.W    .ERR3
  260.     TST.L    (A4)            ;END OF RELOCATION?
  261.     BEQ.S    .INNERHUNK
  262.     MOVE.L    D6,D1
  263.     MOVE.L    A4,D2
  264.     ADDQ.L    #4,D2
  265.     MOVEQ.L    #4,D3            ;GET CORRESPONDING HUNK TO RELOCATE TO
  266.     BSR.W    DOSLOAD
  267.     TST.L    D0
  268.     BEQ.W    .ERR3
  269.  
  270.     MOVE.L    (A4),D0
  271.  
  272.     bsr    .getmemflag
  273.  
  274.     LSL.L    #2,D0            ;ALLOC MEM OF SIZE OF RELOCTABLE
  275.     ADDQ.L    #7,D0
  276.     AND.L    #$FFFFFFF8,D0
  277.  
  278.     BSR.W    ALLOCM
  279.     TST.L    D0
  280.     BEQ.W    .ERR4
  281.     MOVE.L    D0,A2
  282.     MOVE.L    D6,D1
  283.     MOVE.L    A2,D2
  284.     MOVE.L    (A4),D3            ;GET CORRESPONDING RELOCS TO RELOCATE
  285.     LSL.L    #2,D3
  286.     BSR.W    DOSLOAD
  287.     TST.L    D0
  288.     BEQ.W    .ERR4
  289.     MOVE.L    (A4),D3            ;# OF RELOCS
  290.     MOVE.L    4(A4),D2        ;WHICH HUNK TO RELOCATE TO?
  291.     MOVE.L    D5,A0
  292.     BRA.S    .HRELOCT3
  293.  
  294. .HRELOCT4
  295.     MOVE.L    4(A0),D0
  296.     LSL.L    #2,D0
  297.     SUBQ.L    #4,D0
  298.     MOVE.L    D0,A0
  299. .HRELOCT3
  300.     DBF    D2,.HRELOCT4        
  301.  
  302.     ADDQ.L    #8,A0
  303.     MOVE.L    A0,D0            ;GOT THE HUNK TO RELOCATE TO
  304.     LEA.L    8(A3),A1        ;THIS HUNK WILL BE RELOCATED
  305.     MOVE.L    A2,A0            ;HERE ARE THE RELOCS
  306.     BRA.S    .HRELOCT5
  307.  
  308. .HRELOCT6
  309.     MOVE.L    (A0)+,D1
  310.     ADD.L    D0,(A1,D1.L)
  311. .HRELOCT5
  312.     DBF    D3,.HRELOCT6
  313.     MOVE.L    A2,A1            ;FREE THE MEM OF SIZE OF RELOCTABLE
  314.     MOVE.L    (A4),D0
  315.     LSL.L    #2,D0
  316.     ADDQ.L    #7,D0
  317.     AND.L    #$FFFFFFF8,D0
  318.     BSR.W    FREEM
  319.     BRA.W    .HRELOCT
  320.  
  321. .HSYMBOLT
  322.     MOVE.L    D6,D1
  323.     MOVE.L    A4,D2
  324.     MOVEQ.L    #4,D3
  325.     BSR.W    DOSLOAD            ;GET NAMELENGTH
  326.     TST.L    D0
  327.     BEQ.W    .ERR3
  328.     MOVE.L    (A4),D0
  329.     AND.L    #$FFFFFF,D0
  330.     BEQ.W    .INNERHUNK        ;IF NO NAMELENGTH -> END OF HUNK
  331.     LSL.L    #2,D0            ;LEN OF NAME IS IN LONGWORDS
  332.     ADDQ.L    #4,D0            ;SKIP ALSO SYMBOLOFFSET
  333.     MOVE.L    D6,D1
  334.     MOVE.L    D0,D2
  335.     MOVE.L    #OFFSET_CURRENT,D3
  336.     BSR.W    DOSSEEK
  337.     CMP.L    #-1,D0
  338.     BEQ.S    .ERR3
  339.     BRA.S    .HSYMBOLT
  340.  
  341. .HENDT
  342.     ADDQ.L    #1,D4
  343.     CMP.L    D7,D4
  344.     BLS.W    .HN
  345.  
  346. .END    MOVE.L    D6,D1
  347.     BSR.W    DOSCLOSE
  348.     MOVE.L    D5,D0
  349.     ADDQ.L    #4,D0
  350.     MOVE.L    D0,OSM_LASTLOADSEG
  351.     LSR.L    #2,D0
  352.     ADDQ.L    #8,A7
  353.  
  354.     move.l    (_RESLOAD),a2
  355.     jsr    (resload_FlushCache,a2)        ; added by JOTD: cache flush
  356.  
  357.     MOVEM.L    (A7)+,D2-D7/A2-A4
  358.     RTS
  359. .ERR4
  360. .ERR3
  361. .ERR2    MOVE.L    D6,D1
  362.     BSR.W    DOSCLOSE
  363. .ERR    MOVEQ.L    #0,D0
  364.  
  365.     ADDQ.L    #8,A7
  366.     MOVEM.L    (A7)+,D2-D7/A2-A4
  367.     RTS
  368.  
  369. ; utility routines used by LoadSeg()
  370.  
  371. .getmemflag:
  372.     btst    #HUNKB_CHIP,D0            ; CHIPMEM required?
  373.     beq.b    .nochip
  374.  
  375.     move.l    #MEMF_CHIP,D1
  376.     bra.b    .doalloc
  377. .nochip
  378.     btst    #HUNKB_FAST,D0            ; FASTMEM required?
  379.     beq.b    .nofast
  380.  
  381.     move.l    #MEMF_FAST,D1
  382.     bra.b    .doalloc
  383.  
  384. .nofast
  385.     MOVEQ.L    #MEMF_ANY,D1            ;any memtype will do
  386. .doalloc
  387.     rts
  388.  
  389. ; UnLoadSeg()
  390.  
  391. DOSUNLOADSEG
  392.     MOVE.L    A2,-(A7)
  393.     LSL.L    #2,D1
  394. .1    MOVE.L    D1,A1
  395.     MOVE.L    (A1),D1
  396.     LSL.L    #2,D1
  397.     MOVE.L    D1,A2
  398.  
  399.     SUBQ.L    #4,A1
  400.     MOVE.L    (A1),D0
  401.     BSR.W    FREEM
  402.  
  403.     MOVE.L    A2,D1
  404.     BNE.S    .1
  405.  
  406.     MOVEQ.L    #0,D0
  407.     MOVE.L    (A7)+,A2
  408.     RTS
  409.  
  410. **************************************************************************
  411. *   I/O FILE FUNCTIONS                                                   *
  412. **************************************************************************
  413.  
  414. ;will not work properly if the program assigns a subdir
  415. ;I (JOTD) added it for SlamTilt, which only assigns to PROGDIR:
  416. ;so it's OK
  417.  
  418. ASSIGNLOCK:
  419.     moveq.l    #1,D0
  420.     rts
  421.  
  422. ;will not work properly if the program assigns a subdir
  423. ;I (JOTD) added it for SlamTilt, which only assigns to PROGDIR:
  424. ;so it's OK
  425.  
  426. ASSIGNPATH:
  427.     moveq.l    #1,D0
  428.     rts
  429.  
  430. ;filehandle represents the following structure (do not try to access it!):
  431. ;0-allocated len
  432. ;4-total filelength
  433. ;8-pointer in file
  434. ;$c-openmodus
  435. ;$10-filename
  436.  
  437. ;open strips the device from the filename (avoiding problems with assigns)
  438. DOSOPEN
  439.     MOVEM.L    D4-D5/A3-A5,-(A7)
  440.     MOVE.L    D1,A3
  441.     MOVEQ.L    #$10,D4            ;HEADERLEN
  442.     TST.B    (A3)
  443.     BEQ.S    .ERR
  444. .1    ADDQ.L    #1,D4
  445.     TST.B    (A3)+
  446.     BNE.S    .1
  447.     ADDQ.L    #7,D4            ;NEXT $8-BOUNDARY
  448.     AND.L    #$FFFFFFF8,D4
  449.     MOVE.L    D1,D5            ;^NAME
  450.     MOVE.L    D4,D0            ;ALLOC. LENGTH
  451.     MOVEQ.L    #0,D1
  452.     BSR.W    ALLOCM
  453.     TST.L    D0
  454.     BEQ.S    .ERR
  455.     MOVE.L    D0,A3
  456.     MOVE.L    D4,(A3)            ;ALLOC. LENGTH
  457.     MOVE.L    D2,$C(A3)        ;OPENMODE
  458.     CLR.L    $8(A3)            ;INFILE-POINTER TO 0
  459.     LEA.L    $10(A3),A4        ;TRANS FILENAME
  460.     MOVE.L    D5,A5
  461. .2    MOVE.B    (A5)+,(A4)
  462.     BEQ.S    .4
  463.     CMP.B    #':',(A4)
  464.     BNE.S    .3
  465.     LEA.L    $10-1(A3),A4
  466. .3    ADDQ.W    #1,A4
  467.     BRA.S    .2
  468.  
  469. .4    CMP.W    #MODE_NEWFILE,D2    ;IF MODE_NEWFILE, DELETE FILE
  470.     BEQ.S    .NEWFILE
  471.  
  472.  
  473.  
  474.  
  475.                     ;CHECK IF FILE EXISTS
  476.     LEA.L    $10(A3),A0        ;filename
  477. ;    CMP.L    #'b/fs',(A0)        ;LORDS OF WAR
  478. ;    BEQ.S    .ERR2
  479.     move.l    _RESLOAD(PC),a1
  480.     jsr    (resload_GetFileSize,a1)
  481.     MOVE.L    D0,$4(A3)
  482.     MOVE.L    A3,D0
  483. .END    MOVEM.L    (A7)+,D4-D5/A3-A5
  484.     RTS
  485.  
  486. .ERR2
  487.     MOVE.L    A3,A1
  488.     MOVE.L    (A1),D0
  489.     BSR.W    FREEM
  490.  
  491. .ERR    MOVEQ.L    #0,D0
  492.     BRA.S    .END
  493.  
  494. .NEWFILE                ;REDUCE FILE TO 0 BYTE
  495.     CLR.L    $4(A3)
  496.     LEA.L    $10(A3),A0
  497.     MOVEQ.L    #0,D0
  498.     LEA.L    $0.W,A1
  499.  
  500.     move.l    OSM_JSTFLAGS,D4
  501.     btst    #AFB_NOOSSWAP,D4
  502.     bne.b    .SKIPZFILE        ;no write to disk if NOOSSWAP is on
  503.  
  504.     move.l    _RESLOAD(pc),a5
  505.     jsr    (resload_SaveFile,a5)
  506.  
  507. .SKIPZFILE
  508.     MOVE.L    A3,D0
  509.     BRA.S    .END
  510.  
  511. ; < D2: destination
  512.  
  513. DOSLOAD:
  514.     MOVEM.L    D3/A2-A3,-(A7)
  515.     MOVE.L    D1,A3
  516.     MOVE.L    $8(A3),D1        ;OFFSET
  517.     MOVE.L    D2,A1            ;DEST
  518.     LEA.L    $10(A3),A0        ;NAME
  519.     MOVE.L    $4(A3),D0        ;TOTAL LENGTH OF FILE
  520.     SUB.L    D1,D0
  521.     EXG    D3,D0
  522.     CMP.L    D0,D3            ;CMP REQUESTED/REAL
  523.     BHI.S    .1            ;IF REQUESTED<=REAL
  524.     MOVE.L    D3,D0
  525. .1    MOVE.L    D0,D3
  526.                     ;LOAD IT
  527.     MOVE.L    _RESLOAD(PC),A2
  528. ;    MOVE.W    #$80,$DFF096
  529.     JSR    resload_LoadFileOffset(A2)
  530. ;    MOVE.L    GRABAS+$32(PC),$DFF084
  531. ;    MOVE.W    #$8080,$DFF096
  532.     ADD.L    D3,$8(A3)
  533.     MOVE.L    D3,D0
  534.     MOVEM.L    (A7)+,D3/A2-A3
  535.     RTS
  536.  
  537.  
  538. DOSSAVE
  539.     MOVEM.L    D3-D4/A2-A3,-(A7)
  540.     MOVE.L    D1,A3
  541.     MOVE.L    $8(A3),D1        ;OFFSET
  542.     MOVE.L    D2,A1            ;DEST
  543.     LEA.L    $10(A3),A0        ;NAME
  544.     MOVE.L    D3,D0
  545.  
  546.     btst    #AFB_NOOSSWAP,D4    ; added by JOTD
  547.     bne.b    .SKIPWFILE        ; no write to disk if NOOSSWAP is on
  548.  
  549.     MOVE.L    _RESLOAD(PC),A2        ;SAVE IT
  550.     JSR    resload_SaveFileOffset(A2)
  551. .SKIPWFILE:
  552.     ADD.L    D3,$8(A3)
  553.     LEA.L    $10(A3),A0        ;filename
  554.     move.l    _RESLOAD(PC),a1
  555.     jsr    (resload_GetFileSize,a1)
  556.     MOVE.L    D0,$4(A3)
  557.     MOVE.L    D3,D0
  558.     MOVEM.L    (A7)+,D3-D4/A2-A3
  559.     RTS
  560.  
  561. ;free allocated structure
  562. _DOSUNLOCK
  563. DOSCLOSE
  564.     MOVE.L    D1,A1
  565.     MOVE.L    (A1),D0
  566.     BSR.W    FREEM
  567.     RTS
  568.  
  569. DOSSEEK:
  570.     MOVE.L    D1,A1
  571.     CMP.L    #OFFSET_BEGINNING,D3
  572.     BEQ.S    .BEGM
  573.     CMP.L    #OFFSET_END,D3
  574.     BEQ.S    .ENDM
  575.     CMP.L    #OFFSET_CURRENT,D3
  576.     BEQ.S    .CURM
  577. .ERR    MOVEQ.L    #-1,D0
  578.     RTS
  579.  
  580. .CURM
  581.     MOVE.L    $8(A1),D0
  582.     MOVE.L    D0,D1
  583.     ADD.L    D2,D1
  584.     CMP.L    $4(A1),D1
  585.     BHI.S    .ERR
  586.     MOVE.L    D1,$8(A1)
  587.     RTS
  588.  
  589. .ENDM    MOVE.L    $8(A1),D0
  590.     MOVE.L    $4(A1),D1
  591.     ADD.L    D2,D1
  592.     CMP.L    $4(A1),D1
  593.     BHI.S    .ERR
  594.     MOVE.L    D1,$8(A1)
  595.     RTS
  596.  
  597. .BEGM    MOVE.L    $8(A1),D0
  598.     MOVE.L    D2,D1
  599.     CMP.L    $4(A1),D1
  600.     BHI.S    .ERR
  601.     MOVE.L    D1,$8(A1)
  602.     RTS
  603.  
  604. ; Added by JOTD. Now Flashback works
  605.  
  606. DOSINFO:
  607.     movem.l    A1,-(A7)
  608.     move.l    D2,A1
  609.  
  610.     move.l    #0,(id_NumSoftErrors,A1)    ; no errors!
  611.     move.l    #0,(id_UnitNumber,A1)        ; unit 0 should be OK
  612.     move.l    #ID_VALIDATED,(id_DiskState,A1)    ; disk validated
  613.     move.l    #10000,(id_NumBlocks,A1)    ; number of blocks = 500 Megs
  614.     move.l    #ID_DOS_DISK,(id_DiskType,A1)    ; disk type: OFS
  615.     move.l    #0,(id_VolumeNode,A1)        ; zero this entry. it sucks but...
  616.     move.l    #0,(id_InUse,A1)        ; not in use
  617.  
  618.     movem.l    (A7)+,A1
  619.     moveq.l    #-1,D0        ; returns TRUE (success)
  620.     rts
  621.  
  622. DOSDELAY:            ; added by JOTD
  623.     tst.l    D1
  624.     beq    .exit
  625. .loop
  626.     bsr    _waitvb
  627.     subq.l    #1,D1
  628.     bne.b    .loop
  629. .exit
  630.     rts
  631.  
  632. **************************************************************************
  633. *   FILE MANAGEMENT FUNCTIONS                                            *
  634. **************************************************************************
  635.  
  636. ;filehandle represents the following structure (do not try to access it!):
  637. ;0-allocated len
  638. ;4-total filelength
  639. ;8-pointer in file
  640. ;$c-openmodus
  641. ;$10-filename
  642.  
  643. ;if $10 of filehandle is a : its the volumelock
  644. ;atm: 0.L-$1000 len, 4.W-# of file in examine/exnext (-1:invalid), 
  645. ;6.W-MAX# OF FILES, 8.L-pointer in table, $c.L-openmode
  646.  
  647. DOSLOCK:
  648.     MOVEM.L    D4-D5/A3-A5,-(A7)
  649.     MOVE.L    D1,A3
  650.     MOVEQ.L    #$10,D4            ;HEADERLEN
  651.     TST.B    (A3)
  652.     BEQ.S    .ERR
  653. .1    ADDQ.L    #1,D4
  654.     TST.B    (A3)+
  655.     BNE.S    .1
  656.     ADDQ.L    #7,D4            ;NEXT $8-BOUNDARY
  657.     AND.L    #$FFFFFFF8,D4
  658.     MOVE.L    D1,D5            ;^NAME
  659.     MOVE.L    D4,D0            ;ALLOC. LENGTH
  660.     MOVE.L    #MEMF_CLEAR,D1
  661.     BSR.W    ALLOCM
  662.     TST.L    D0
  663.     BEQ.S    .ERR
  664.  
  665.     MOVE.L    D0,A3
  666.     MOVE.L    D4,(A3)            ;ALLOC. LENGTH
  667.     MOVE.L    D2,$C(A3)        ;OPENMODE
  668.     CLR.L    $8(A3)            ;INFILE-POINTER TO 0
  669.     LEA.L    $10(A3),A4        ;TRANS FILENAME
  670.     MOVE.L    D5,A5
  671. .2    MOVE.B    (A5)+,(A4)        ; remove the volume name
  672.     BEQ.S    .4
  673.     CMP.B    #':',(A4)
  674.     BNE.S    .3
  675.     TST.B    (A5)
  676.     BEQ.S    .VOLUMELOCK
  677.  
  678.     LEA.L    $10-1(A3),A4
  679. .3    ADDQ.W    #1,A4
  680.     BRA.S    .2
  681.  
  682. .4                    ;CHECK IF FILE EXISTS
  683.     LEA.L    $10(A3),A0        ;filename
  684.     move.l    _RESLOAD(PC),a1
  685.     jsr    (resload_GetFileSize,a1)
  686.     MOVE.L    D0,$4(A3)
  687.  
  688.     TST.L    D0
  689.     BEQ.S    .LOCKFAILED
  690.     MOVE.L    A3,D0
  691. .END    MOVEM.L    (A7)+,D4-D5/A3-A5
  692.     RTS
  693.  
  694. .ERR    MOVEQ.L    #0,D0
  695.     BRA.S    .END
  696.  
  697. .VOLUMELOCK
  698.     MOVE.L    (A3),D0            ;free mem because we need a larger area
  699.     MOVE.L    A3,A1            ; JOTD: bugfix: changed D1 to A1
  700.     BSR.W    FREEM
  701.  
  702.     MOVE.L    #$1000,D0
  703.     MOVE.L    #MEMF_CLEAR,D1    ; MEMF_CHIP removed
  704.     BSR.W    ALLOCM
  705.     TST.L    D0
  706.     BEQ.S    .ERR
  707.     MOVE.L    D0,A3
  708.     MOVE.B    #':',$10(A3)    ; addressing error bug: ':' instead of #':'
  709.     MOVE.L    D2,$C(A3)
  710.     MOVE.W    #-1,4(A3)
  711.                     ;8(A3) is already clear due MEMF_CLEAR
  712.     MOVE.L    #$1000,(A3)
  713.     BRA.S    .END
  714.  
  715. .LOCKFAILED
  716.     MOVEQ.L    #0,D0
  717. .FREEMEM
  718.     MOVE.L    D0,D5
  719.     MOVE.L    (A3),D0
  720.     MOVE.L    A3,A1            ; bugfix there too
  721.     BSR.W    FREEM
  722.     MOVE.L    D5,D0
  723.     BRA.S    .END
  724.  
  725. _DUPLOCK
  726.     TST.L    D0
  727.     BEQ.S    .ROOTLOCK
  728.     MOVE.L    D1,-(A7)
  729.     MOVE.L    D1,A0
  730.     MOVE.L    (A0),D0
  731.     MOVE.L    #MEMF_CLEAR,D1
  732.     BSR.W    ALLOCM
  733.     MOVE.L    (A7)+,A0
  734.     TST.L    D0
  735.     BEQ.S    .ERR
  736.     MOVE.L    D0,A1
  737.     MOVE.L    (A0),D1
  738.     SUBQ.L    #1,D1
  739. .1    MOVE.B    (A0)+,(A1)+
  740.     DBF    D1,.1
  741.     RTS
  742.  
  743. .ERR    MOVEQ.L    #0,D0
  744.     RTS
  745.  
  746. .ROOTLOCK
  747.     MOVEQ.L    #$14,D0
  748.     MOVE.L    #MEMF_CLEAR,D1
  749.     BSR.W    ALLOCM
  750.     TST.L    D0
  751.     BEQ.S    .ERR
  752.     MOVE.L    D0,A0
  753.     MOVE.L    #$14,(A0)
  754.     RTS
  755.  
  756. _EXAMINE
  757.     MOVEM.L    A2-A3,-(A7)
  758.     MOVE.L    D1,A3
  759.  
  760.     CMP.B    #':',$10(A3)
  761.     BNE.W    .ONEFILE
  762.     LEA.L    $20(A3),A0
  763.     MOVE.W    #($1000-$20)/4-1,D0
  764. .CLR1    CLR.L    (A0)+
  765.     DBF    D0,.CLR1
  766.                     ;GET FILEDIR
  767.     MOVE.L    #$1000-$20,D0
  768.     LEA.L    $20(A3),A1
  769.     LEA.L    FILEPATH(PC),A0
  770.     move.l    _RESLOAD(pc),a2
  771.     jsr    (resload_ListFiles,a2)
  772.     MOVE.W    D0,$6(A3)
  773.     TST.W    D0
  774.     BEQ.W    .ERR
  775.     LEA.L    $20(A3),A0
  776.     MOVE.L    _RESLOAD(PC),A2
  777.     jsr    (resload_GetFileSize,a2)
  778.     TST.L    D0
  779.     BEQ.W    .ERR
  780.     MOVE.W    #1,$4(A3)
  781.     MOVE.L    D2,A2
  782.     MOVE.L    D0,fib_Size(A2)
  783.     MOVE.L    #2,(A2)    
  784.     MOVE.L    #-3,fib_DirEntryType(A2)
  785.     SUBQ.L    #1,D0
  786.     LSR.L    #8,D0            ;ASSUMED FFS
  787.     LSR.L    #1,D0
  788. ;    DIVU    #$1E8,D0        ;WOULD BE OFS
  789.     ADDQ.L    #1,D0
  790.     MOVE.L    D0,fib_NumBlocks(A2)    
  791.     LEA.L    $20(A3),A0
  792.     LEA.L    fib_FileName(A2),A1
  793. .COPYFILENAME2
  794.     MOVE.B    (A0)+,(A1)+
  795.     TST.B    -1(A0)
  796.     BNE.S    .COPYFILENAME2
  797.     MOVE.L    A0,8(A3)
  798.     MOVEQ.L    #-1,D0
  799.     MOVEM.L    (A7)+,A2-A3
  800.     RTS
  801.  
  802. .ONEFILE
  803.     lea    $10(A3),a0        ;filename
  804.     move.l    _RESLOAD(PC),a2
  805.     jsr    (resload_GetFileSize,a2)
  806.     TST.L    D0
  807.     BEQ.S    .ERR
  808.     MOVE.L    D2,A2
  809.     MOVE.L    D0,fib_Size(A2)
  810.     MOVE.L    #2,(A2)    
  811.     MOVE.L    #ST_FILE,fib_DirEntryType(A2)
  812.     MOVE.L    #ST_FILE,fib_EntryType(A2)    ; added by JOTD, Sensible Soccer CD32 v1.2
  813.     MOVE.L    #$F,fib_Protection(A2)        ; added by JOTD, File rwxd
  814.     LSR.L    #8,D0            ;ASSUMED FFS
  815.     LSR.L    #1,D0
  816. ;    DIVU    #$1E8,D0        ;WOULD BE OFS
  817.     ADDQ.L    #1,D0
  818.     MOVE.L    D0,fib_NumBlocks(A2)    
  819.     LEA.L    $10(A3),A0
  820.     LEA.L    fib_FileName(A2),A1
  821. .COPYFILENAME
  822.     MOVE.B    (A0)+,(A1)+
  823.     TST.B    -1(A0)
  824.     BNE.S    .COPYFILENAME
  825.     MOVEQ.L    #-1,D0
  826.     MOVEM.L    (A7)+,A2-A3
  827.     RTS
  828.  
  829. .ERR        pea    _LVOExamine
  830.         pea    _dosname
  831.         bra    _emufail
  832.  
  833. ; added by JOTD (needed by SlamTilt)
  834.  
  835. _EXAMINEFH:
  836.     MOVEM.L    D3/A3,-(A7)
  837.     MOVE.L    D1,A3
  838.     MOVE.L    D2,D3            ;output struct
  839.     LEA.L    $10(A3),A0        ;NAME
  840.     move.l    A0,D1
  841.     move.l    #MODE_OLDFILE,D2
  842.     bsr    DOSOPEN    
  843.     move.l    D0,-(A7)
  844.  
  845.     move.l    D3,D2
  846.     move.l    D0,D1            ;filehandle!
  847.     bsr    _EXAMINE
  848.  
  849.     move.l    (A7)+,D1
  850.     bsr    DOSCLOSE
  851.  
  852.     MOVEM.L    (A7)+,D3/A3
  853.     RTS
  854.  
  855.  
  856.  
  857.     rts
  858.  
  859. FILEPATH
  860.     DC.B    0
  861.     EVEN
  862.  
  863.